// 中间件的作用
// 多个中间件之间，共享同一份req和res基于这样的特性，我们可以在上游的中间件中，统一为req或res对象添加自定义的属性或方法，供下游的中间件或路由进行使用。

// 1.导入express
const express = require('express')
// 2.创建web服务器实例
const app = express()


//4.定义中间件函数
const mw = function (req, res, next) {
    console.log('调用了第一个中间件');
    const time = new Date()
    req.date = time // 通过中间件为req添加time属性和值，下游请求的req同样可以使用
    next()
}

const mw1 = function (req, res, next) {
    console.log('调用了第二个中间件');
    next()
}

const mw2 = function (req, res, next) {
    console.log('调用了第三个中间件');
    next()
}
// ---------------------------------------------------------------全局中间件------------------
//5.注册为全局生效的中间件使用use() use(函数)
app.use(mw)
app.use(mw1)
app.use(mw2)

// 6.定义多个全局中间件
// 可以使用app.use()连续定义多个全局中间件。客户端请求到达服务器之后，会按照中间件定义的先后顺序依次进行调用
app.get('/', (req, res) => {
    res.send('使用中间件的值' + req.date)
})
app.get('/user', (req, res) => {
})

// ---------------------------------------------------------------局部中间件------------------
//  7.不使用app.use()定义的中间件，叫做局部生效的中间件，示例代码如下:
// 定义中间件函数
const noAll = function (req, res, next) {
    console.log('局部中间件');
    next()
}
const noAll1 = function (req, res, next) {
    console.log('局部中间件1');
    next()
}
const noAll2 = function (req, res, next) {
    console.log('局部中间件2');
    next()
}
const noAll3 = function (req, res, next) {
    console.log('局部中间件3');
    next()
}
// 路由中使用局部中间件 只对使用了该中间件的路由生效get(url,中间件函数,回调函数)
// 定义多个中间件函数 get(url,中间件函数,中间件函数,中间件函数,...,回调函数) 或 get(url,[中间件函数,中间件函数,中间件函数,...],回调函数)
app.get('/jubu', noAll, (req, res) => {
    res.send('调用了局部中间件')
})

app.get('/jubu2', noAll1, noAll2, noAll3, (req, res) => {
    res.send('调用了多个局部中间件')
})


// 3.启动服务器
app.listen(8080, () => {
    console.log('express is running at http://127.0.0.1:8080');
})